// 计算文件MD5.
// 不使用炫彩元素, 直接使用html文件作为窗口内容.
package main

import (
	"crypto/md5"
	_ "embed"
	"encoding/hex"
	app "gitee.com/go_888/xcgui/xcgui/app"
	edge "gitee.com/go_888/xcgui/xcgui/edge"
	wapi "gitee.com/go_888/xcgui/xcgui/wapi"
	wutil "gitee.com/go_888/xcgui/xcgui/wapi/wutil"
	window "gitee.com/go_888/xcgui/xcgui/window"
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
	"os"
	"path/filepath"
)

var a *app.X结构_全局API

type MainWindow struct {
	w  *window.Window
	wv *edge.Web视图
}

func NewMainWindow() *MainWindow {
	m := &MainWindow{}
	m.main()
	return m
}

func (m *MainWindow) main() {
	// 创建窗口
	m.w = window.X创建窗口(0, 0, 550, 500, "计算文件MD5", 0, xcc.X窗口样式_居中|xcc.X窗口样式_拖动边框|xcc.X窗口样式_允许最大化)
	// 设置窗口透明类型
	m.w.X设置透明类型(xcc.X窗口透明标识_阴影窗口).X设置透明度(255)
	// 设置窗口阴影
	m.w.X设置阴影信息(8, 255, 0, false, 0)

	// 创建 webview
	edge窗口, _ := edge.X创建(edge.X选项{})
	m.wv, _ = edge窗口.X创建Web视图(m.w.X句柄, edge.Web视图选项{
		X填充父窗口: true,
	})
	// 加载网页
	url, _ := filepath.Abs("./edge/CalcMD5/index.html")
	url = "file:///" + url
	m.wv.X导航(url)

	// 绑定函数
	m.bindBasicFuncs()
	m.bindFuncs()
	// 显示窗口
	m.w.X显示(true)
}

// bindBasicFuncs 绑定基本函数.
func (m *MainWindow) bindBasicFuncs() {
	// 绑定 moveWindow
	m.wv.X绑定函数("moveWindow", func(x int32, y int32) {
		// 减去阴影大小8
		wapi.X设置窗口位置(m.w.X取HWND句柄(), 0, m.w.DpiConv(x-8), m.w.DpiConv(y-8), 0, 0, wapi.X窗口大小定位标识_保留当前大小|wapi.X窗口大小定位标识_保留当前Z顺序)
	})

	// 绑定 最小化窗口函数
	m.wv.X绑定函数("minimizeWindow", func() {
		m.w.X显示方式(xcc.X窗口显示方式_最小化激活)
	})

	// 绑定 切换最大化窗口函数
	m.wv.X绑定函数("toggleMaximize", func() {
		m.w.X最大化(!m.w.X是否最大化())
	})

	// 绑定 关闭窗口函数
	m.wv.X绑定函数("closeWindow", func() {
		m.w.X关闭()
	})
}

// bindFuncs 绑定函数.
func (m *MainWindow) bindFuncs() {
	// 绑定 goOpenFile
	m.wv.X绑定函数("goOpenFile", func() string {
		return wutil.X打开单文件对话框(m.w.X句柄, []string{"All Files(*.*)", "*.*"}, "")
	})

	// 绑定 calculateMD5
	m.wv.X绑定函数("calculateMD5", func(filePath string) string {
		// 判断文件是否存在
		if !xc.X是否存在文件或文件夹2(filePath) {
			return "错误: 文件不存在"
		}
		// 读取文件内容
		data, err := os.ReadFile(filePath)
		if err != nil {
			return "错误: " + err.Error()
		}

		// 计算MD5
		hash := md5.Sum(data)
		md5Str := hex.EncodeToString(hash[:])

		// 返回结果（包含文件名和MD5）
		return "文件: " + filePath + "\nMD5: " + md5Str
	})
}

func main() {
	a = app.X创建(true)
	a.X启用自动DPI(true).X启用DPI(true)

	NewMainWindow()

	a.X运行()
	a.X退出()
}
